#include "myRpcConfig.h"

#include <cstdlib>
#include <fstream>
#include <iostream>
#include <string>
namespace RPC
{
    void MyrpcConfig::LoadConfigFile( const char *config_file )
    {
        // 首先需要打开文件
        std::ifstream infile( config_file );
        if ( !infile.is_open() )
        {
            std::cout << config_file << " is open failed!" << std::endl;
            exit( EXIT_FAILURE );
        }

        // 配置文件会存在注释，在这里我们是当#是注释的
        std::string data;
        while ( std::getline( infile, data ) )
        {
            // 去除掉前面多余的空格
            Trim( data );

            if ( data[ 0 ] == '#' || data.empty() )
            {
                continue;
            }

            // 然后是找到=好的位置
            int index = data.find( '=' );
            if ( index == std::string::npos )
            {
                // 说明不存在等号，则非法,则这个也不加入到map中
                continue;
            }

            // 到了这里等号就是存在的，但是等号之间可能也会存在空格，就需要继续处理
            std::string key;
            std::string value;
            key = data.substr( 0, index );
            Trim( key );

            int endidx = data.find( '\n', index );
            value = data.substr( index + 1, endidx - index - 1 );
            Trim( value );
            m_configMap.emplace( key, value );
        }
    }

    /**
     * @brief 这个函数从存放配置信息的容器中根据键去查找值，
     *
     * @param key
     * @return std::string 如果找到了就返回value，否则返回空
     */
    std::string MyrpcConfig::load( const std::string &key )
    {

        auto it = m_configMap.find( key );
        if ( it == m_configMap.end() )
        {
            return "";
        }

        return it->second;
    }

    /**
     * @brief 这个函数的作用是去掉数据里面的多余的空格
     *
     * @param data
     */
    void MyrpcConfig::Trim( std::string &data )
    {
        // 这是去除前导空格
        int index = data.find_first_not_of( ' ' );
        if ( index != std::string::npos )
        {
            // 说明找到了第一个不为空格的字符
            data = data.substr( index, data.size() - index );
        }

        // 取出后导空格
        index = data.find_last_not_of( ' ' );
        if ( index != std::string::npos )
        {
            // 找到了字符串末尾不为空格的字符，下标是从0开始的
            data = data.substr( 0, index + 1 );
        }
    }
}  // namespace RPC